臨界區間問題(Critical Section Problem)的發生是因為共用變數(shared variable)被更改時可能會中斷,若某些指令我們可以一行完成,就可以避免 race condition 的問題。前面說的 Peterson's Solution 是軟體上的支援,若硬體可以將指令變成像原子一樣,是無法中斷執行的最小單元 atomic instructions
,我們就可以用這些特殊的指令來解決臨界區間問題。
以下提供兩個硬體指令例子。
TestAndSet():除了 lock 一開始被宣告為 False 之外,TestAndSet() 都會上鎖(lock = True),並返回 value。
只有第一個行程做完(因為 lock initialize False)才會把 lock 解開給其他行程做,當第一個行程在做的時候,其他行程去執行 TestAndSet(),都會被 lock 住。
不符合 Bounded waiting。
使用 test_and_set() 製作符合 Bounded waiting 之互斥:任一個進入 CS 的行程都要經過 n-1 次。
共用變數:
程式碼:
參考:周志遠作業系統 Ch6: Process Synchronization (D): Hardware Support